
package verificaforcadasenha;

/**
 *
 * @author Felipe Tavares
 */
public class Regra02 {
    
    private String password;
    private static final String LETRAS_EM_ORDEM = "abcdefghijlmnopqrstuvwxyz";
    private static final String NUMEROS_EM_ORDEM = "0123456789";
    private static final String SIMBOLOS_EM_ORDEM = "!@#$%^&*()";
    

    public Regra02(String password) {
        this.password = password;
    }
    
    public int pontuacaoPeloTamanhoDaSenha(String senha)
    {      
        return (senha.length()) * 4;
    }
    
    public int pontuacaoPorQuantidadeDeCaracteresEspecificos(String senhaTemp, int pontuacao) throws appSenhaException
    {
        Utils senha = new Utils(senhaTemp);
        
        if(senha.getQuantidadeDeLetrasMaiusculas() > 0 && senha.getQuantidadeDeLetrasMaiusculas() < senha.getSenha().length())
        {
            pontuacao += senha.getQuantidadeDeLetrasMaiusculas() * 2;
        }
        
        if(senha.getQuantidadeDeLetrasMinusculas() > 0 && senha.getQuantidadeDeLetrasMinusculas() < senha.getSenha().length())
        {
            pontuacao += senha.getQuantidadeDeLetrasMinusculas() * 2;
        }
        
        if(senha.getQuantidadeDeNumeros()> 0 && senha.getQuantidadeDeNumeros()< senha.getSenha().length())
        {
            pontuacao += senha.getQuantidadeDeNumeros()* 2;
            pontuacao += obterQuantidadeDeNumerosNoMeioDaSenha(senha);
        }
        
        if(senha.getQuantidadeDeSimbolos() > 0)
        {
            pontuacao += senha.getQuantidadeDeSimbolos() * 6;
        }
        
        return pontuacao;
    }
    
    public int subtrairPontosDaPontuacao(String senhaTemp, int pontuacao) throws appSenhaException
    {
        Utils senha = new Utils(senhaTemp);
        
        if(senha.getQuantidadeDeLetrasMaiusculas() + senha.getQuantidadeDeLetrasMinusculas() == senha.getSenha().length())
        {
            pontuacao -= senha.getSenha().length();   
        }
        
        if(senha.getQuantidadeDeNumeros() == senha.getSenha().length())
        {
            pontuacao -= senha.getSenha().length();
        }
            
        if(obterQuantidadeDeCaracterRepetido(senha.getSenha()) != 0)
        {
            pontuacao -= obterQuantidadeDeCaracterRepetido(senha.getSenha());
        }
        
        if((obterQuantidadeDeCaracterRepetido(senha.getLetrasMaiusculas())) != 0 )
        {
            pontuacao -= obterQuantidadeDeCaracterRepetido(senha.getLetrasMaiusculas()) * 2;
        }
        
        if((obterQuantidadeDeCaracterRepetido(senha.getLetrasMinusculas())) != 0 )
        {
            pontuacao -= obterQuantidadeDeCaracterRepetido(senha.getLetrasMinusculas()) * 2;
        }
        
        if((obterQuantidadeDeCaracterRepetido(senha.getNumeros())) != 0 )
        {
            pontuacao -= obterQuantidadeDeCaracterRepetido(senha.getNumeros()) * 2;
        }
        
        if(obterQuantidadeDeCaractersConsecutivos(senha.getSenha()) != 0)
        {
            pontuacao -= obterQuantidadeDeCaractersConsecutivos(senha.getSenha()) * 3;
        }
        
        return pontuacao;
    }
    
    public int pontuacaoPorTamanhoDaSenhaDefinidos(String senhaTemp, int pontuacao) throws appSenhaException
    {
        Utils senha = new Utils(senhaTemp);
        
        int quantidadeDeTiposNaSenha = 0;
        
        if(senha.getLetrasMaiusculas().length() > 0)
        {
            quantidadeDeTiposNaSenha++;
        }
        
        if(senha.getLetrasMinusculas().length() > 0)
        {
            quantidadeDeTiposNaSenha++;
        }
        
        if(senha.getNumeros().length() > 0)
        {
            quantidadeDeTiposNaSenha++;
        }
        
        if(senha.getSimbolos().length() > 0)
        { 
            quantidadeDeTiposNaSenha++;
        }
        
        if(senha.getSenha().length() >= 8 && quantidadeDeTiposNaSenha >= 3)
        {
            pontuacao += (3*2);
        }    
        
        if(senha.getSenha().length() < 8 && quantidadeDeTiposNaSenha == 4)
        {
            pontuacao += (4*2);
        }

        return pontuacao;
    }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    private int obterQuantidadeDeNumerosNoMeioDaSenha(Utils senha)
    {
        int pontuacao = 0;
        char[] senhaEmVetor = senhaEmVetor = senha.getSenha().toCharArray();
        
        for(int i = 1; i < senha.getSenha().length(); i++)
        {
            if(Character.isDigit(senhaEmVetor[i]))
                pontuacao++;
        }
        
        return pontuacao;
    }
    
    private int obterQuantidadeDeCaracterRepetido(String senha)
    {
        char[] senhaEmArray = senha.toCharArray();
        int quantidade = 0;
        
        for(int i = 0; i < senhaEmArray.length; i++)
        {
            for(int j = 0; j < senhaEmArray.length; j++)
            {
                if(senhaEmArray[i] == senhaEmArray[j])
                    quantidade++;
            }
        }
        return quantidade;
    }
    
    private int obterQuantidadeDeCaractersConsecutivos(String senha)
    {
        int quantidade = 0;
        quantidade += this.numeroCaracteresConsecutivos(LETRAS_EM_ORDEM, senha);
        quantidade += this.numeroCaracteresConsecutivos(NUMEROS_EM_ORDEM, senha);
        quantidade += this.numeroCaracteresConsecutivos(SIMBOLOS_EM_ORDEM, senha);
        return quantidade;
    }
    
    private int numeroCaracteresConsecutivos (String elementosEmOrdem, String senha)
    {       
        int numero = 0;
        int maximoValorQueNaoExcedeACapacidadeDaString = elementosEmOrdem.length() - 3;
        
        for (int i = 0; i < elementosEmOrdem.length(); i++) 
        {
            if (i < maximoValorQueNaoExcedeACapacidadeDaString)
            {
                String stringDosElementosConsecutivos = elementosEmOrdem.substring(i, i + 3);
                String stringRevertida = new StringBuffer(stringDosElementosConsecutivos).reverse().toString();
                if (senha.toLowerCase().indexOf(stringDosElementosConsecutivos) != -1) 
                { 
                    numero++;
                }
            }
	}
        return numero;
    }
    
}

